package string;

/**
 *  String的演示
 */
public class StringDemo {
    public static void main(String[] args) {
        /**
         * 使用字面量("")来创建字符串对象时,JVM会检查常量池中是否有该对象
         * 1)若没有,则会创建字符串对象,将其引用存入到常量中
         * 2)若有,则不会创建
         */

        String s1 = "123abc";//常量池还没有,因此创建该字符串对象,并存入常量池
        String s2 = "123abc";//常量池已经有了,直接复用
        //引用类型 ==  ,比较的是他们的存在堆中的地址是否相同
        System.out.println(s1==s2);//true

        s1 = s1+"!";
        System.out.println(s1 == s2);

        //编译器在编译时,发现是两个字面量相连,则会直接连接好并将结果保存起来
        //如下语句被编译为:String s3 = "123abc";
        String s3 = "123"+"abc";
        System.out.println(s2 == s3);//true

        String s4 = "123";
        //因为s3是一个变量,所以在编译期并不会直接编译好
        String s5 = s4+"abc";//创建一个新的对象存储123abc
        System.out.println(s1==s5);//false

        String s = new String("hello");//创建了两个对象
        String s6 = "hello";//复用常量池中的字面量地址
        System.out.println(s==s6); //false, ==比较两个地址是否相同


        //在实际应用中,String比较相等一般都是比较字符串的内容是否相同
        //因此我们需要使用equals()方法来比较两个字符串内容是否相同
        System.out.println(s.equals(s1));//true, equals()比较的是内容是否相同---必须掌握
















    }
}
